package co.edu.usbcali.presentation.backingBeans;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.component.calendar.Calendar;
import org.primefaces.component.commandbutton.CommandButton;
import org.primefaces.component.inputtext.InputText;
import org.primefaces.context.RequestContext;

import co.edu.usbcali.correo.EmailController;
import co.edu.usbcali.exceptions.ZMessManager;
import co.edu.usbcali.modelo.Roles;
import co.edu.usbcali.modelo.Usuarios;
import co.edu.usbcali.modelo.dto.UsuariosDTO;
import co.edu.usbcali.presentation.businessDelegate.IBusinessDelegatorView;
import co.edu.usbcali.utilities.FacesUtils;

/**
 * @author Zathura Code Generator http://code.google.com/p/zathura
 *         www.zathuracode.org
 *
 */
@ManagedBean
@ViewScoped
public class UsuariosView implements Serializable {
	private static final long serialVersionUID = 1L;
	private String txtClave;
	private String txtClave2;
	private String txtEmail;
	private InputText txtEstadoRegistro;
	private String txtNombre;
	private InputText txtUsuCrea;
	private InputText txtUsuModifica;
	private InputText txtCodigoRol_Roles;
	private InputText txtCodigoUsua;
	private Calendar txtFechaCreacion;
	private Calendar txtFechaModifcacion;
	private CommandButton btnSave;
	private CommandButton btnModify;
	private CommandButton btnDelete;
	private CommandButton btnClear;
	private List<UsuariosDTO> data;
	private UsuariosDTO selectedUsuarios;
	private Usuarios entity;
	private UsuariosDTO usuario;
	private boolean showDialog;
	@ManagedProperty(value = "#{BusinessDelegatorView}")
	private IBusinessDelegatorView businessDelegatorView;

	public UsuariosView() {
		super();
	}

	@PostConstruct
	public void consultarUsuario() {

		try {
			String email = FacesContext.getCurrentInstance().getExternalContext()
					.getUserPrincipal().getName();
						
			if(email!=null&&email.length()>1){
				usuario=businessDelegatorView.consultaUsuarioXEmail(email);	
				FacesUtils.setManagedBeanInSession("usuario", usuario);
				txtNombre=usuario.getNombre();
				txtEmail=usuario.getEmail();
				txtClave=usuario.getClave();
				txtClave2=usuario.getClave();
			}else{
				usuario=new UsuariosDTO();
				usuario.setRol("No existe ninguna sesion activa");
			}

		} catch (Exception e) {
		}

	}
	
	public String recuperarContrasena(){
		
		try {			
			businessDelegatorView.recuperarContrasena(txtEmail);	
			FacesUtils.addInfoMessage("La Contraseña se envio con exito al Email ingresado");
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
			RequestContext.getCurrentInstance().execute("$('#myModal').modal('show');");
		}
		
		
		return null;
	}

	public String registroAdmin() {

		try {
			Roles rol = businessDelegatorView.getRoles(1L);

			entity = new Usuarios();
			entity.setNombre(txtNombre);
			entity.setClave(txtClave);
			entity.setEmail(txtEmail);
			entity.setFechaCreacion(new Date());
			entity.setFechaModifcacion(new Date());
			entity.setUsuCrea("Registro");
			entity.setUsuModifica("Registro");
			entity.setEstadoRegistro("A");
			entity.setRoles(rol);

			if (txtClave.equals(txtClave2)) {

			} else {
				throw new Exception("No coincide la contraseña ingresada");
			}

			businessDelegatorView.saveUsuarios(entity);
			EmailController mail=new EmailController();
			String subject="Registro Exitoso en el sistema VAOI";
			String messageBody="Bienvenido ADMIN <br>  Usuario: " + txtEmail +" <br> Password:" + txtClave;
			mail.performTask(txtEmail, subject, messageBody, null);
			
			FacesUtils.addInfoMessage("Registro Exitoso");

		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String registroUsuario() {

		try {
			Roles rol = businessDelegatorView.getRoles(2L);

			entity = new Usuarios();
			entity.setNombre(txtNombre);
			entity.setClave(txtClave);
			entity.setEmail(txtEmail);
			entity.setFechaCreacion(new Date());
			entity.setFechaModifcacion(new Date());
			entity.setUsuCrea("Registro");
			entity.setUsuModifica("Registro");
			entity.setEstadoRegistro("A");
			entity.setRoles(rol);

			if (txtClave.equals(txtClave2)) {

			} else {
				throw new Exception("No coincide la contraseña ingresada");
			}

			businessDelegatorView.saveUsuarios(entity);
			
			EmailController mail=new EmailController();
			String subject="Registro Exitoso en el sistema VAOI";
			String messageBody="Bienvenido USER <br>  Usuario: " + txtEmail +" <br> Password:" + txtClave;
			mail.performTask(txtEmail, subject, messageBody, null);
			
			FacesUtils.addInfoMessage("Registro Exitoso");

		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}
	
	public String modificarUsuario() {
		try {

			entity = businessDelegatorView.getUsuarios(usuario.getCodigoUsua());		

			entity.setNombre(txtNombre);
			entity.setClave(txtClave);
			entity.setEmail(txtEmail);
			entity.setFechaModifcacion(new Date());
			entity.setUsuModifica(usuario.getNombre());
			entity.setEstadoRegistro("A");

			if (txtClave.equals(txtClave2)) {

			} else {
				throw new Exception("No coincide la contraseña ingresada");
			}
			businessDelegatorView.updateUsuarios(entity);
			FacesUtils.addInfoMessage("El usuario se modifico con exito");
		} catch (Exception e) {
			data = null;
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}


	public String action_clear() {
		entity = null;
		selectedUsuarios = null;

		/*
		 * if (txtClave != null) { txtClave.setValue(null);
		 * txtClave.setDisabled(true); }
		 * 
		 * if (txtEmail != null) { txtEmail.setValue(null);
		 * txtEmail.setDisabled(true); }
		 */

		if (txtEstadoRegistro != null) {
			txtEstadoRegistro.setValue(null);
			txtEstadoRegistro.setDisabled(true);
		}

		/*
		 * if (txtNombre != null) { txtNombre.setValue(null);
		 * txtNombre.setDisabled(true); }
		 */

		if (txtUsuCrea != null) {
			txtUsuCrea.setValue(null);
			txtUsuCrea.setDisabled(true);
		}

		if (txtUsuModifica != null) {
			txtUsuModifica.setValue(null);
			txtUsuModifica.setDisabled(true);
		}

		if (txtCodigoRol_Roles != null) {
			txtCodigoRol_Roles.setValue(null);
			txtCodigoRol_Roles.setDisabled(true);
		}

		if (txtFechaCreacion != null) {
			txtFechaCreacion.setValue(null);
			txtFechaCreacion.setDisabled(true);
		}

		if (txtFechaModifcacion != null) {
			txtFechaModifcacion.setValue(null);
			txtFechaModifcacion.setDisabled(true);
		}

		if (txtCodigoUsua != null) {
			txtCodigoUsua.setValue(null);
			txtCodigoUsua.setDisabled(false);
		}

		if (btnSave != null) {
			btnSave.setDisabled(true);
		}

		if (btnDelete != null) {
			btnDelete.setDisabled(true);
		}

		return "";
	}

	public String action_save() {
		try {
			if ((selectedUsuarios == null) && (entity == null)) {
				action_create();
			} else {
				action_modify();
			}

			data = null;
		} catch (Exception e) {
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_create() {
		try {
			entity = new Usuarios();

			Long codigoUsua = FacesUtils.checkLong(txtCodigoUsua);

			entity.setClave(FacesUtils.checkString(txtClave));
			entity.setCodigoUsua(codigoUsua);
			entity.setEmail(FacesUtils.checkString(txtEmail));
			entity.setEstadoRegistro(FacesUtils.checkString(txtEstadoRegistro));
			entity.setFechaCreacion(FacesUtils.checkDate(txtFechaCreacion));
			entity.setFechaModifcacion(FacesUtils
					.checkDate(txtFechaModifcacion));
			entity.setNombre(FacesUtils.checkString(txtNombre));
			entity.setUsuCrea(FacesUtils.checkString(txtUsuCrea));
			entity.setUsuModifica(FacesUtils.checkString(txtUsuModifica));
			entity.setRoles((FacesUtils.checkLong(txtCodigoRol_Roles) != null) ? businessDelegatorView
					.getRoles(FacesUtils.checkLong(txtCodigoRol_Roles)) : null);
			businessDelegatorView.saveUsuarios(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYSAVED);
			action_clear();
		} catch (Exception e) {
			entity = null;
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String action_modify() {
		try {
			if (entity == null) {
				Long codigoUsua = new Long(selectedUsuarios.getCodigoUsua());
				entity = businessDelegatorView.getUsuarios(codigoUsua);
			}

			entity.setClave(FacesUtils.checkString(txtClave));
			entity.setEmail(FacesUtils.checkString(txtEmail));
			entity.setEstadoRegistro(FacesUtils.checkString(txtEstadoRegistro));
			entity.setFechaCreacion(FacesUtils.checkDate(txtFechaCreacion));
			entity.setFechaModifcacion(FacesUtils
					.checkDate(txtFechaModifcacion));
			entity.setNombre(FacesUtils.checkString(txtNombre));
			entity.setUsuCrea(FacesUtils.checkString(txtUsuCrea));
			entity.setUsuModifica(FacesUtils.checkString(txtUsuModifica));
			entity.setRoles((FacesUtils.checkLong(txtCodigoRol_Roles) != null) ? businessDelegatorView
					.getRoles(FacesUtils.checkLong(txtCodigoRol_Roles)) : null);
			businessDelegatorView.updateUsuarios(entity);
			FacesUtils.addInfoMessage(ZMessManager.ENTITY_SUCCESFULLYMODIFIED);
		} catch (Exception e) {
			data = null;
			FacesUtils.addErrorMessage(e.getMessage());
		}

		return "";
	}

	public String getTxtClave() {
		return txtClave;
	}

	public void setTxtClave(String txtClave) {
		this.txtClave = txtClave;
	}

	public String getTxtEmail() {
		return txtEmail;
	}

	public void setTxtEmail(String txtEmail) {
		this.txtEmail = txtEmail;
	}

	public InputText getTxtEstadoRegistro() {
		return txtEstadoRegistro;
	}

	public void setTxtEstadoRegistro(InputText txtEstadoRegistro) {
		this.txtEstadoRegistro = txtEstadoRegistro;
	}

	public String getTxtNombre() {
		return txtNombre;
	}

	public void setTxtNombre(String txtNombre) {
		this.txtNombre = txtNombre;
	}

	public InputText getTxtUsuCrea() {
		return txtUsuCrea;
	}

	public void setTxtUsuCrea(InputText txtUsuCrea) {
		this.txtUsuCrea = txtUsuCrea;
	}

	public InputText getTxtUsuModifica() {
		return txtUsuModifica;
	}

	public void setTxtUsuModifica(InputText txtUsuModifica) {
		this.txtUsuModifica = txtUsuModifica;
	}

	public InputText getTxtCodigoRol_Roles() {
		return txtCodigoRol_Roles;
	}

	public void setTxtCodigoRol_Roles(InputText txtCodigoRol_Roles) {
		this.txtCodigoRol_Roles = txtCodigoRol_Roles;
	}

	public Calendar getTxtFechaCreacion() {
		return txtFechaCreacion;
	}

	public void setTxtFechaCreacion(Calendar txtFechaCreacion) {
		this.txtFechaCreacion = txtFechaCreacion;
	}

	public Calendar getTxtFechaModifcacion() {
		return txtFechaModifcacion;
	}

	public void setTxtFechaModifcacion(Calendar txtFechaModifcacion) {
		this.txtFechaModifcacion = txtFechaModifcacion;
	}

	public InputText getTxtCodigoUsua() {
		return txtCodigoUsua;
	}

	public void setTxtCodigoUsua(InputText txtCodigoUsua) {
		this.txtCodigoUsua = txtCodigoUsua;
	}

	public List<UsuariosDTO> getData() {
		try {
			if (data == null) {
				data = businessDelegatorView.getDataUsuarios();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return data;
	}

	public void setData(List<UsuariosDTO> usuariosDTO) {
		this.data = usuariosDTO;
	}

	public UsuariosDTO getSelectedUsuarios() {
		return selectedUsuarios;
	}

	public void setSelectedUsuarios(UsuariosDTO usuarios) {
		this.selectedUsuarios = usuarios;
	}

	public CommandButton getBtnSave() {
		return btnSave;
	}

	public void setBtnSave(CommandButton btnSave) {
		this.btnSave = btnSave;
	}

	public CommandButton getBtnModify() {
		return btnModify;
	}

	public void setBtnModify(CommandButton btnModify) {
		this.btnModify = btnModify;
	}

	public CommandButton getBtnDelete() {
		return btnDelete;
	}

	public void setBtnDelete(CommandButton btnDelete) {
		this.btnDelete = btnDelete;
	}

	public CommandButton getBtnClear() {
		return btnClear;
	}

	public void setBtnClear(CommandButton btnClear) {
		this.btnClear = btnClear;
	}

	public TimeZone getTimeZone() {
		return java.util.TimeZone.getDefault();
	}

	public IBusinessDelegatorView getBusinessDelegatorView() {
		return businessDelegatorView;
	}

	public void setBusinessDelegatorView(
			IBusinessDelegatorView businessDelegatorView) {
		this.businessDelegatorView = businessDelegatorView;
	}

	public boolean isShowDialog() {
		return showDialog;
	}

	public void setShowDialog(boolean showDialog) {
		this.showDialog = showDialog;
	}

	public String getTxtClave2() {
		return txtClave2;
	}

	public void setTxtClave2(String txtClave2) {
		this.txtClave2 = txtClave2;
	}

	public UsuariosDTO getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuariosDTO usuario) {
		this.usuario = usuario;
	}

}
